/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica;

import controlador.EventoPanel;
import dao.LecturaDAO;
import dao.SustratoDAO;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Stroke;
import java.util.List;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import modelo.Lectura;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 *
 * @author Elias Mendoza
 */
public class ComportamientoHumedad extends Thread {

  private DefaultCategoryDataset dataset;
  XYSeriesCollection series = new XYSeriesCollection();
  
  private JProgressBar barraComportamiento;
  private JPanel panelContenedor;
  private Object[] filaTablaNombreSustrato;
  private DefaultTableModel modeloTablaNombreSustrato = new DefaultTableModel();
  private String nombreSustrato;

  public ComportamientoHumedad(JProgressBar barra, JPanel panelContenedor,String sustrato) {
    
    
    this.barraComportamiento = barra;
    barraComportamiento.setBorderPainted(true);
    barraComportamiento.setMinimum(0);
    barraComportamiento.setMaximum(100);
    barraComportamiento.setStringPainted(true);
    barraComportamiento.setValue(0);
    this.panelContenedor=panelContenedor;
    this.nombreSustrato = sustrato;
    
    this.start();
    

  }

  public ComportamientoHumedad() {
  }
  public void inicializarTablaSustratoNombre(JTable tablaNombreSustrato){
    tablaNombreSustrato.setModel(modeloTablaNombreSustrato);
    modeloTablaNombreSustrato.addColumn("Nombre");
    filaTablaNombreSustrato = new Object[1];
  }
  public void addFila(String nombreSustrato){
    filaTablaNombreSustrato[0] = nombreSustrato;
    modeloTablaNombreSustrato.addRow(filaTablaNombreSustrato);
  }
  public void obtnerNombres(){
    SustratoDAO sustratoDAO = new SustratoDAO();
    List listNombres = sustratoDAO.consultaNombresSustrato();
    for(Object obj: listNombres){
      String nombre = (String) obj;
      addFila(nombre);
    }
  }
  public void obtenerLecturas(){
    LecturaDAO lecturaDAO = new LecturaDAO();
    FechaHora fh = new FechaHora();
    List lecturas = lecturaDAO.LecturaDiaCriteria(fh.getFecha(),nombreSustrato);
    barraComportamiento.setMaximum(lecturas.size());
    dataset = new DefaultCategoryDataset();
    float refOptima = 0;
    int ejeX=5;
    XYSeries lecturaSensor = new XYSeries("lectura");
    int incrementoBarra=0;
    for(Object lec:lecturas){
      
      Lectura lectura = (Lectura) lec;
      int numGrupos = lectura.getSustrato().getGrupo().size();
      System.out.println(numGrupos);
      if(incrementoBarra==0){
         refOptima = lectura.getSustrato().getReferencia().getOptimo();
        float refCritica = lectura.getSustrato().getReferencia().getPuntoCritico();
        float refCapacidadCampo = lectura.getSustrato().getReferencia().getCapacidadCampo();
        float refPuntoMarchites = lectura.getSustrato().getReferencia().getPuntoMarchites();
        float refSaturacion = lectura.getSustrato().getReferencia().getSaturacion();
        XYSeries serieOptimo = new XYSeries("optimo");
        serieOptimo.add(refOptima*100/refOptima, ejeX);
        serieOptimo.add(refOptima*100/refOptima,lecturas.size()*5);
        series.addSeries(serieOptimo);
                
        XYSeries serieCritico = new XYSeries("Critico");
        serieCritico.add(refCritica*100/refOptima, ejeX);
        serieCritico.add(refCritica*100/refOptima,lecturas.size()*5);
        series.addSeries(serieCritico);
        XYSeries serieCapacidadCampo = new XYSeries("CapacidadCampo");
        serieCapacidadCampo.add(refCapacidadCampo*100/refOptima, ejeX);
        serieCapacidadCampo.add(refCapacidadCampo*100/refOptima,lecturas.size()*5);
        series.addSeries(serieCapacidadCampo);
        XYSeries seriePuntoMarchites = new XYSeries("PuntoMarchites");
        seriePuntoMarchites.add(refPuntoMarchites*100/refOptima, ejeX);
        seriePuntoMarchites.add(refPuntoMarchites*100/refOptima,lecturas.size()*5);
        series.addSeries(seriePuntoMarchites);
        XYSeries serieSaturacion = new XYSeries("Saturacion");
        serieSaturacion.add(refSaturacion*100/refOptima, ejeX);
        serieSaturacion.add(refSaturacion*100/refOptima,lecturas.size()*5);
        series.addSeries(serieSaturacion);
        System.out.println("comparando ----");
      }
      barraComportamiento.setValue(incrementoBarra+=1);
      System.out.println(refOptima);
      System.out.println("suma de lecturas: "+lectura.sumaLecturas()+" numGrupos: "+numGrupos);
      
      float promedio = (float) ((lectura.sumaLecturas()/(numGrupos*4))*100/refOptima);
      lecturaSensor.add(promedio, ejeX);
      System.out.println("promedio :"+promedio);
      ejeX+=5;
   
    }
    series.addSeries(lecturaSensor);
    JFreeChart chart = ChartFactory.createXYLineChart
      ("Comportamiento de Humedad de "+nombreSustrato,  // Title
       "Porcentaje de Humedad %",           // Y-Axis label
       "Referencias y Lectura",           // X-Axis label
      series,          // Dataset
     PlotOrientation.HORIZONTAL,
      true, true,true);
    chart.setBackgroundPaint(Color.WHITE);

    XYPlot plot = (XYPlot) chart.getPlot();
    plot.setBackgroundPaint(Color.WHITE);
    plot.setDomainGridlinePaint(Color.WHITE);
    plot.setRangeGridlinePaint(Color.WHITE);
    XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) plot.getRenderer();
//    xylineandshaperenderer.setBaseShapesVisible(true); 
//   xylineandshaperenderer.setBaseShapesFilled(true);

   
   
Stroke st1 = new BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,1.0f, new float[] { 2.0f, 6.0f }, 0.0f);
Stroke st2 = new BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,1.0f, new float[] { 2.0f, 6.0f }, 0.0f);
Stroke st3 = new BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,1.0f, new float[] { 2.0f, 6.0f }, 0.0f);
Stroke st4 = new BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,1.0f, new float[] { 2.0f, 6.0f }, 0.0f);
Stroke st5 = new BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,1.0f, new float[] { 2.0f, 6.0f }, 0.0f);
Stroke st6 = new BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,1.0f, new float[] { 20.0f, 6.0f }, 0.0f);

   xylineandshaperenderer.setSeriesStroke(0, st1,true);
   xylineandshaperenderer.setSeriesStroke(1, st2,true);
   xylineandshaperenderer.setSeriesStroke(2, st3,true);
   xylineandshaperenderer.setSeriesStroke(3, st4,true);
   xylineandshaperenderer.setSeriesStroke(4, st5,true);
   xylineandshaperenderer.setSeriesStroke(5, st6,true);

   
   xylineandshaperenderer.setSeriesPaint(0, Color.BLUE);
   xylineandshaperenderer.setSeriesPaint(1, Color.ORANGE);
   xylineandshaperenderer.setSeriesPaint(2, Color.GREEN);
   xylineandshaperenderer.setSeriesPaint(3, Color.RED);
   xylineandshaperenderer.setSeriesPaint(4, Color.blue);
   xylineandshaperenderer.setSeriesPaint(5, Color.MAGENTA);

   
    ChartPanel panel = new ChartPanel(chart);
    EventoPanel ep = new EventoPanel(panelContenedor);
    ep.cargaPanelInicio(panelContenedor);
    ep.cargaPanelGrafica1(panel);
    
  }
    @Override
  public void run() {
    obtenerLecturas();
   
  }
}
